package portal.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import portal.excepcion.DAOExcepcion;
import portal.modelo.Cotizacion;
import portal.modelo.EncabezadoCotizacion;
import portal.modelo.Juegos;
import portal.modelo.Servicios;
import portal.util.ConexionBD;

public class CotizacionDAO extends BaseDAO{

	public ArrayList<Cotizacion> listarMisCotizaciones(String idPersona) {
		// TODO Auto-generated method stub
		ArrayList<Cotizacion> cotizacionLista = new ArrayList<Cotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE numeroDniPersona = '"+idPersona+"' AND EstadoCotizacion_idEstadoCotizacion = 2 ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Cotizacion cotizacion = new Cotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
	}

	public ArrayList<Cotizacion> listarMisCotizacionesDesaprobadas(String idPersona) {
		// TODO Auto-generated method stub
		ArrayList<Cotizacion> cotizacionLista = new ArrayList<Cotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE numeroDniPersona = '"+idPersona+"' AND EstadoCotizacion_idEstadoCotizacion = 5 ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Cotizacion cotizacion = new Cotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
	}
	
	public ArrayList<Cotizacion> listarMisCotizacionesAprobadas(String idPersona) {
		// TODO Auto-generated method stub
		ArrayList<Cotizacion> cotizacionLista = new ArrayList<Cotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE numeroDniPersona = '"+idPersona+"' AND EstadoCotizacion_idEstadoCotizacion = 3 ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Cotizacion cotizacion = new Cotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
			
	}
	
	public Boolean aprobarCotizacionServlet(String idPersona, String idCotizacion) throws DAOExcepcion {
		// TODO Auto-generated method stub
		boolean status = Boolean.TRUE;
		String query = "call APROBAR_COTIZACION(?,?);";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idPersona);
			stmt.setString(2, idCotizacion);
			
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("NO MODIFICO");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return status;
	}

	public Boolean desaprobarCotizacionServlet(String idPersona, String idCotizacion) throws DAOExcepcion {
		// TODO Auto-generated method stub
		boolean status = Boolean.TRUE;
		String query = "call DESAPROBAR_COTIZACION(?,?);";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idPersona);
			stmt.setString(2, idCotizacion);
			
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("NO MODIFICO");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return status;
	}
	
	public ArrayList<EncabezadoCotizacion> obtenerEncabezadoCotizacionAdmin(String idCotizacion) {
		// TODO Auto-generated method stub
		ArrayList<EncabezadoCotizacion> cotizacionLista = new ArrayList<EncabezadoCotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta, ComentarioCotizacion FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE idCotizacion = "+idCotizacion+" ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					EncabezadoCotizacion cotizacion = new EncabezadoCotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10), rs.getString(11));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
	}

	public ArrayList<EncabezadoCotizacion> obtenerEncabezadoCotizacion(String idPersona, String idCotizacion) {
		// TODO Auto-generated method stub
		
		ArrayList<EncabezadoCotizacion> cotizacionLista = new ArrayList<EncabezadoCotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta, ComentarioCotizacion FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE numeroDniPersona = '"+idPersona+"' AND idCotizacion = "+idCotizacion+" ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					EncabezadoCotizacion cotizacion = new EncabezadoCotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10), rs.getString(11));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
	}

	public ArrayList<Juegos> obtenerDetalleJuegosCotizacion(String idCotizacion) {
		// TODO Auto-generated method stub
		ArrayList<Juegos> cotizacionJuegosLista = new ArrayList<Juegos>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT NombreJuego, descripcionJuego, ROUND(costoPorPersonaJuego,2), participantesDetalleCotizacionJuego, ROUND(precioDetalleCotizacionJuego,2) FROM DetalleCotizacionJuego DCS INNER JOIN Juego J ON J.idJuego = DCS.Juego_idJuego WHERE Cotizacion_idCotizacion = "+idCotizacion+";";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Juegos cotizacionJuegos = new Juegos(rs.getString(1), rs.getString(2), rs.getDouble(3), rs.getString(4), rs.getString(5));
					cotizacionJuegosLista.add(cotizacionJuegos);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionJuegosLista;
	}

	public ArrayList<Servicios> obtenerDetalleServiciosCotizacion(String idCotizacion) {
		// TODO Auto-generated method stub
		ArrayList<Servicios> cotizacionServiciosLista = new ArrayList<Servicios>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT NombreServicio, descripcionServicio, ROUND(costoPorPersonaServicio,2), participantesDetalleCotizacionServicio, ROUND(precioDetalleCotizacionServicio,2) FROM DetalleCotizacionServicio DCS INNER JOIN Servicio J ON J.idServicio = DCS.Servicio_idServicio WHERE Cotizacion_idCotizacion = "+idCotizacion+";";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Servicios cotizacionServicios = new Servicios(rs.getString(1), rs.getString(2), rs.getDouble(3), rs.getString(4), rs.getString(5));
					cotizacionServiciosLista.add(cotizacionServicios);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionServiciosLista;
	}

	public ArrayList<Cotizacion> listarReservasPorEstado(int estado) {
		// TODO Auto-generated method stub
		ArrayList<Cotizacion> cotizacionLista = new ArrayList<Cotizacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		    try {
				String query = "SELECT idCotizacion, fechaCreacionCotizacion, fechaProgramadaCotizacion, cantidadPersonasCotizacion, ROUND(subTotalCotizacion, 2), ROUND(igvCotizacion,2), ROUND(precioTotalCotizacion,2), nombreClub, descripcionEstadoCotizacion, (descuentoOferta*100) as descuentoOferta, CONCAT(nombresPersona, ' ', apellidoPaternoPersona), numeroDniPersona, numeroCelularPersona FROM Cotizacion C INNER JOIN Club CL ON CL.idClub = C.Club_idClub INNER JOIN EstadoCotizacion E ON E.idEstadoCotizacion = C.EstadoCotizacion_idEstadoCotizacion INNER JOIN Oferta O ON O.idOferta = C.Oferta_idOferta INNER JOIN Persona PE ON PE.idPersona = C.Persona_idPersona WHERE EstadoCotizacion_idEstadoCotizacion = "+estado+" ;";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					
					Cotizacion cotizacion = new Cotizacion(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10), rs.getString(11), rs.getString(12), rs.getString(13));
					cotizacionLista.add(cotizacion);
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				try {
					throw new DAOExcepcion(e.getMessage());
				} catch (DAOExcepcion e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return cotizacionLista;
	}

	public Boolean cambiarEstadoReserva(String idCotizacion, String idEstado) throws DAOExcepcion {
		// TODO Auto-generated method stub
		boolean status = Boolean.TRUE;
		String query = "UPDATE Cotizacion SET EstadoCotizacion_idEstadoCotizacion = "+idEstado+" WHERE idCotizacion = "+idCotizacion+";";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("NO MODIFICO");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return status;
	}

	

	

	

}
